#!/usr/bin/env python
# -*- coding: UTF8 	-*-

from psycopg2 import connect
from strSQL import recepcion_uva
from strSQL import maceracion
from strSQL import fermentacion
from strSQL import mezcla
from strSQL import embotellado
from strSQL import despacho

class Deglose:
    
    def __init__(self, cnx):
        self.cursor = cnx.cursor()
        self.nivel = 0
        self.genera_diccionario()
        self.volumen = None
    
    def tab_nivel(self, nivel):
        return ("  ") * nivel
    
    def genera_diccionario(self):
        self.diccionario = {}
        
    def recepcion_uva(self, codigo=None, porcentaje=1.0, hacia_atras=False, nivel=1):
        if codigo is None:
            sql = recepcion_uva.strSelectRecepcionUva
            self.nivel = 0
        else:
            sql = recepcion_uva.strSelectRecepcionUva.replace("ORDER", "WHERE r.codigo_recepcion_uva = %s ORDER")
            sql = sql % codigo
            self.nivel += 1
            tab = self.tab_nivel(nivel)
        self.cursor.execute(sql)
        r = self.cursor.dictfetchall()
        
        det = False
        
        if self.volumen is None:
            self.volumen = r[0]["cantidad_recepcion_uva"]
        for i in r:
            if not hacia_atras:
                self.cursor.execute(recepcion_uva.strSelectRecepcionUvaMaceracion % i["codigo_recepcion_uva"])
                re = self.cursor.dictfetchall()
                for j in re:
                    if not self.maceracion(j["codigo_maceracion"], (j["porcentaje"]/100)*porcentaje, nivel+1):
                        try:
                            self.diccionario["A%s"%j["codigo_maceracion"]] += (porcentaje*(j["porcentaje"]/100))*self.volumen
                        except:
                            self.diccionario["A%s"%j["codigo_maceracion"]] = (porcentaje*(j["porcentaje"]/100))*self.volumen
                        det = True
        return det

    def maceracion(self, codigo, porcentaje=1.0, nivel=1,hacia_atras=False):
        if codigo is None:
            sql = maceracion.strSelectMaceracion
        else:
            sql = maceracion.strSelectMaceracion.replace("ORDER", "WHERE m.codigo_maceracion = %s ORDER")
            sql = sql % codigo
            self.nivel += 1
            tab = self.tab_nivel(nivel)
        self.cursor.execute(sql)
        r = self.cursor.dictfetchall()
        detalle = False
        
        if len(r) == 0:
            try:
                self.diccionario["A"%codigo] += porcentaje
            except:
                self.diccionario["A"%codigo] = porcentaje
        if self.volumen is None:
            self.volumen = r[0]["volumen_maceracion"]
        for i in r:
            if not hacia_atras:
                self.cursor.execute(maceracion.strSelectFermentacionMaceracion % i["codigo_maceracion"])
                re = self.cursor.dictfetchall()
                for j in re:
                    #print tab, "FE", j["codigo_fermentacion"], porcentaje * (j["porcentaje"]/100)
                    if not self.fermentacion(j["codigo_fermentacion"],porcentaje * (j["porcentaje"]/100), nivel+1):
                        try:
                            self.diccionario["F%s"%j["codigo_fermentacion"]] += porcentaje * (j["porcentaje"]/100)*self.volumen
                        except:
                            self.diccionario["F%s"%j["codigo_fermentacion"]] = porcentaje * (j["porcentaje"]/100)*self.volumen
                    detalle=True
                        
        return detalle
        

    def fermentacion(self, codigo, porcentaje=1.0, nivel=1, hacia_atras=False):
        if codigo is None:
            sql = fermentacion.strSelectFermentacion
        else:
            sql = fermentacion.strSelectFermentacion.replace("ORDER", "WHERE f.codigo_fermentacion = %s ORDER")
            sql = sql % codigo
            self.nivel += 1
            tab = self.tab_nivel(nivel)
        self.cursor.execute(sql)
        r = self.cursor.dictfetchall()
        if self.volumen is None:
            self.volumen = r[0]["volumen"]
        detalle = False
        
        if not hacia_atras:
            for i in r:
                self.cursor.execute(fermentacion.strSelectFermentacionRelacion % i["codigo_fermentacion"])
                re = self.cursor.dictfetchall()
                for j in re:
                    if not self.fermentacion(j["codigo_relacion"], porcentaje *(j["porcentaje"]/100), nivel+1):
                        try:
                            self.diccionario["F%s"%j["codigo_relacion"]] += (porcentaje*(j["porcentaje"]/100))*self.volumen
                        except:
                            self.diccionario["F%s"%j["codigo_relacion"]] = (porcentaje*(j["porcentaje"]/100))*self.volumen
                    detalle=True
                    
                self.cursor.execute(fermentacion.strSelectMezclaFermentacion % i["codigo_fermentacion"])
                re1 = self.cursor.dictfetchall()
                for j in re1:
                    if not self.mezcla(j["codigo_mezcla"], porcentaje*(j["porcentaje"]/100)*(j["rendimiento"]/100), nivel+1):
                        try:
                            self.diccionario["M%s"%j["codigo_mezcla"]] += (porcentaje*(j["porcentaje"]/100))*self.volumen
                        except:
                            self.diccionario["M%s"%j["codigo_mezcla"]] = (porcentaje*(j["porcentaje"]/100))*self.volumen
                    detalle = True
        return detalle
    
    def mezcla(self, codigo, porcentaje=1.0, nivel=1, rendimiento=1.0, hacia_atras=False):
        if codigo is None:
            sql = mezcla.strSelectMezcla
        else:
            sql = mezcla.strSelectMezcla.replace("ORDER", "WHERE m.codigo_mezcla = %s ORDER")
            sql = sql % codigo
            self.nivel += 1
            tab = self.tab_nivel(nivel)
        self.cursor.execute(sql)
        r = self.cursor.dictfetchall()
        if self.volumen is None:
            self.volumen = r[0]["volumen"]
        detalle = False
        
        if not hacia_atras:
            for i in r:
                self.cursor.execute(mezcla.strSelectMezclaRelacion % i["codigo_mezcla"])
                re = self.cursor.dictfetchall()
                for j in re:
                    if not self.mezcla(j["codigo_relacion"], porcentaje *(j["porcentaje"]/100), nivel+1):
                        try:
                            self.diccionario["M%s"%j["codigo_relacion"]] += (porcentaje*(j["porcentaje"]/100))*self.volumen
                        except:
                            self.diccionario["M%s"%j["codigo_relacion"]] = (porcentaje*(j["porcentaje"]/100))*self.volumen
                    detalle=True
                
                self.cursor.execute(mezcla.strSelectRelacionEmbotelladoMezcla % i["codigo_mezcla"])
                re = self.cursor.dictfetchall()
                for j in re:
                    try:
                        self.diccionario["E%s"%j["codigo_embotellado"]] = (porcentaje*(j["porcentaje"]/100))*self.volumen
                    except:
                        self.diccionario["E%s"%j["codigo_embotellado"]] = (porcentaje*(j["porcentaje"]/100))*self.volumen
                        
                    detalle=True
                
                sql = mezcla.strSelectDespachoMezcla.replace("where md.codigo_despacho =", "where md.codigo_mezcla =")
                sql = sql.replace("m.codigo_mezcla,", "m.codigo_mezcla, md.codigo_despacho,")
                self.cursor.execute(sql % i["codigo_mezcla"])
                re = self.cursor.dictfetchall()
                for j in re:
                    try:
                        self.diccionario["D%s"%j["codigo_despacho"]] = j["cantidad"]
                    except:
                        self.diccionario["D%s"%j["codigo_despacho"]] = j["cantidad"]
                        
                    detalle=True
        return detalle
                    
    def embotellado(self, codigo, porcentaje=1.0, nivel=1, hacia_atras=False):
        detalle = None
        
        if codigo is None:
            sql = embotellado.strSelectEmbotellado
        else:
            sql = embotellado.strSelectEmbotellado.replace("ORDER", "WHERE m.codigo_embotellado = %s ORDER")
            sql = sql % codigo
        tab = self.tab_nivel(nivel)
        self.cursor.execute(sql)
        r = self.cursor.dictfetchall()
        
        if not hacia_atras:
            for i in r:
                self.cursor.execute(despacho.strSelectDespachoEmbotellado% i["codigo_embotellado"])
                re = self.cursor.dictfetchall()
                for j in re:
                    try:
                        self.diccionario["D%s"%j["codigo_despacho"]] += j["cantidad"]
                    except:
                        self.diccionario["D%s"%j["codigo_despacho"]] = j["cantidad"]
                        
                    detalle=True
        return detalle
    
    def despacho(self, codigo, porcentaje=1.0, nivel=1, hacia_atras=False):
        #detalle = None
        #
        #if codigo is None:
        #    sql = despacho.strSelectDespacho
        #else:
        #    sql = despacho.strSelectDespacho.replace("ORDER", "WHERE d.codigo_despacho = %s ORDER")
        #    sql = sql % codigo
        #tab = self.tab_nivel(nivel)
        #self.cursor.execute(sql)
        #r = self.cursor.dictfetchall()
        
        #for i in r:
        #    self.cursor.execute(despacho.strSelectDespachoEmbotellado% i["codigo_despacho"])
        #    re = self.cursor.dictfetchall()
        #    for j in re:
        #        if not hacia_atras:
        #            self.cursor.execute(despacho.strSelectRelacionEmbotelladoDespacho % i["codigo_embotellado"])
        #            re = self.cursor.dictfetchall()
        #            for j in re:
        #                try:
        #                    self.diccionario["E%s"%j["codigo_embotellado"]] += (porcentaje*(j["porcentaje"]/100))*self.volumen
        #                except:
        #                    self.diccionario["E%s"%j["codigo_embotellado"]] = (porcentaje*(j["porcentaje"]/100))*self.volumen
        #                    
        #                datalle=True
        detalle=False
        return detalle
    
if __name__ == "__main__":
    cnx = connect("dbname=traza")
    cnx.autocommit()
    d = Deglose(cnx)
    d.recepcion_uva(150)
    print d.diccionario
    ##print d.volumen * d.diccionario["EM3"]
    ##print d.volumen, d.diccionario["EM3"]
    #d.genera_diccionario()
    #d.mezcla(56)
    ##print d.diccionario
